home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2001 Spring / Oh!X 2001 Spring Special CD-ROM (Japan).7z / Oh!X 2001 Spring Special CD-ROM (Japan) (Track 1).bin / GALAXY / ohx5-1 / mapctrl.cpp < prev    next >
C/C++ Source or Header  |  2001-01-02  |  8KB  |  318 lines

  1. /*
  2.     Oh!X5号
  3.     GalaxyKnigtsサンプル1
  4.     マップコントロール部分
  5. */
  6.  
  7. #include    "stdafx.h"
  8. #include    "ohx5_1.h"
  9.  
  10. //    形状データ(今回のみ内蔵)
  11. long    sdata[]={
  12.     SIMPLE_CUBE,    2000,    4000,    2000,
  13.     FILE_DATA,        1, 150000,
  14.     FILE_DATA,        2, 150000,
  15.     FILE_DATA,        3, 150000,
  16.     FILE_DATA,        4, 150000,
  17.     FILE_DATA,        5, 150000,
  18.     FILE_DATA,        6, 150000,
  19.     FILE_DATA,        7, 150000,
  20.     FILE_DATA,        8, 150000,
  21.     FILE_DATA,        9, 150000,
  22.     SIMPLE_TORUS,    100,    150,
  23.     SHAPE_DONE
  24. };
  25. //    マップ(これも今回のみ内蔵)
  26. long    mapdata[]={
  27.     2, -60000,-2000,  60000,   0,0,0,
  28.     3, -60000,-2000, 120000,   0,0,0,
  29.     4,-120000,-2000, 180000,   0,0,0,
  30.     5,-120000,-2000, 120000,   0,0,0,
  31.     6,-120000,-2000,  60000,   0,0,0,
  32.     7, 240000,-2000,-180000,   0,0,0,
  33.     8,-180000,-2000,-180000,   0,0,0,
  34.     9,-180000,-2000,-180000,   0,0,0,
  35.     10,180000,-2000,-120000,   0,0,0,
  36.     10,180000,-2000, -60000,   0,0,0,
  37.     0
  38. };
  39.  
  40. //    衝突/イベント判定エリア
  41. //    0=データ終端
  42. //    1=衝突判定
  43. //    2=イベント(イベント言語の起動)
  44. //    3=ビルトインリンク(配布済みデータの参照)
  45. //    4=ローカルリンク(同一マップの別空間と接続)
  46. //    5=メタリンク(同一サーバー別マップと接続)
  47. //    6=ハイパーリンク(別サーバー別マップと接続) 未対応
  48. long    areas[]={
  49.     1, 
  50.     3,
  51.     0
  52. };
  53.  
  54. char    *file_datanames[]={
  55.     "data\\B01_F.x",
  56.     "data\\B02_F.x",
  57.     "data\\B03_F.x",
  58.     "data\\b04_F.x",
  59.     "data\\b05_F.x",
  60.     "data\\b06_F.x",
  61.     "data\\b07_F.x",
  62.     "data\\b07_F.x",
  63.     "data\\b07_F.x"
  64. };
  65.  
  66. void    splitpath( char* fpath,char* fname )
  67. {
  68. char    *fp,*fn,*fpx;
  69.     fp = fpath;
  70.     fn = fname;
  71.     fpx = NULL;
  72.     while( *fn!=0 ){
  73.         if( *fn=='\\' ) fpx = fp;
  74.         *fp++ = *fn++;
  75.     }
  76.     *fp = 0;
  77.     if( fpx!=NULL ){
  78.         fpx++;
  79.         *fpx = 0;
  80.     }
  81. }
  82. /*
  83.     形状の初期化
  84.     今回は内蔵データを利用
  85. */
  86.  
  87. void    init_shapes()
  88. {
  89. HRESULT hr;
  90. int    sct,name,i;
  91. float    v1,v2,v3;
  92. shapes*    spt = shapelist;
  93. char    xfilepath[1024];
  94. char    *xfilename;
  95.     sct = 0;
  96.     max_shapes = 0;
  97.     while( sdata[sct]!=SHAPE_DONE ){
  98.         name = sdata[sct++];
  99.         spt->type = name;
  100.         spt->scale= 1;
  101.         switch( name ){
  102.         case SIMPLE_CUBE:        //    立方体
  103.             v1 = (float)sdata[sct++]/1000;    //    witdh
  104.             v2 = (float)sdata[sct++]/1000;    //    height
  105.             v3 = (float)sdata[sct++]/1000;    //    depth 
  106.             hr = D3DXCreateBox( lpD3DD,v1,v2,v3,&(spt->pt),NULL );
  107.             break;
  108.         case SIMPLE_SPHERE:        //    球
  109.             v1 = (float)sdata[sct++]/1000;    // radius
  110.             hr = D3DXCreateSphere( lpD3DD,v1,D3DX_DEFAULT,D3DX_DEFAULT, &(spt->pt),NULL );
  111.             break;
  112.         case SIMPLE_CYLINDER:    //    シリンダー
  113.             v1 = (float)sdata[sct++]/1000;    //    base radius
  114.             v2 = (float)sdata[sct++]/1000;    //    top radius
  115.             v3 = (float)sdata[sct++]/1000;    //    height
  116.             hr = D3DXCreateCylinder( lpD3DD,v1,v2,v3,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
  117.             break;
  118.         case SIMPLE_TORUS:        //    トーラス
  119.             v1 = (float)sdata[sct++]/1000;    //    inner radius
  120.             v2 = (float)sdata[sct++]/1000;    //    outer radius
  121.             hr = D3DXCreateTorus( lpD3DD,v1,v2,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
  122.             break;
  123.         case FILE_DATA:            //    X-flie形式のロード
  124.             LPD3DXBUFFER        xbuf;    //    XFILEマテリアルバッファ
  125.             xfilename = file_datanames[ sdata[sct++] ];
  126.             if( xfilename==NULL ) { sct++; break; }
  127.             if( FAILED( D3DXLoadMeshFromX(    xfilename,
  128.                                 D3DXMESH_SYSTEMMEM,
  129.                                 lpD3DD,
  130.                                 NULL,
  131.                                 &xbuf,
  132.                                 &( spt->mats ),
  133.                                 &( spt->pt ) ) ) ){
  134.                 sct++;
  135.                 break;
  136.             }
  137.             D3DXMATERIAL* lpxmats = (D3DXMATERIAL*)xbuf->GetBufferPointer();
  138.  
  139.             spt->lpmmats = new D3DMATERIAL8[spt->mats];
  140.             spt->lpmtexs = new LPDIRECT3DTEXTURE8[spt->mats];
  141.  
  142.             for( i=0; i<(int)(spt->mats); i++ ){
  143.                 spt->lpmmats[i] = lpxmats[i].MatD3D;
  144.                 spt->lpmmats[i].Ambient = spt->lpmmats[i].Diffuse;
  145.                 // テクスチャを作成する。
  146.                 splitpath( xfilepath,xfilename );
  147.                 if( lpxmats[i].pTextureFilename != NULL ){
  148.                     strcat( xfilepath,lpxmats[i].pTextureFilename );
  149.                     if( FAILED( D3DXCreateTextureFromFile(    lpD3DD, 
  150.                                                             xfilepath, 
  151.                                                             &( spt->lpmtexs[i] ) ) ) )
  152.                         spt->lpmtexs[i] = NULL;
  153.                 }
  154.             }
  155.             spt->scale = (float)( sdata[ sct++ ] )/1000;
  156.             xbuf->Release();
  157.             break;
  158.         }
  159.         spt++;
  160.         max_shapes++;
  161.     }
  162. }
  163.  
  164. //    形状データ解放
  165. void    release_shapes()
  166. {
  167. DWORD    i,j;
  168. shapes    * spt = shapelist;
  169.     for( i=0;i<max_shapes;i++ ){
  170.         if( spt->type==FILE_DATA ){
  171.             if( spt->lpmmats != NULL )  delete[] spt->lpmmats;
  172.             if( spt->lpmtexs ) {
  173.                 for( j = 0; j < spt->mats; j++ ) {
  174.                     if( spt->lpmtexs[j] ){ spt->lpmtexs[j]->Release(); }
  175.                 }
  176.                 delete[] spt->lpmtexs;
  177.             }
  178.         }
  179.         xRelease( spt->pt );
  180.         spt++;
  181.     }
  182. }
  183.  
  184. //    物体バッファを1つ確保
  185. OBJ3D    *make_object( DWORD name )
  186. {
  187. OBJ3D *obj;
  188.     obj = new OBJ3D;
  189.     obj->back = NULL;
  190.     obj->next = objtop;
  191.     if( objtop!=NULL ) objtop->back = obj;
  192.     objtop = obj;
  193.     obj->type = name;
  194.     return obj;
  195. }
  196.  
  197. //    物体バッファを1つ消去
  198. void    delete_object( OBJ3D *obj )
  199. {
  200.     if( obj==NULL ) return;
  201.     if( objtop == obj ) objtop = objtop->next;
  202.     if( obj->back != NULL ) obj->back->next = obj->next;
  203.     if( obj->next != NULL )    obj->next->back = obj->back;
  204.     xDelete( obj );
  205. }
  206.  
  207. //    マップから物体リストを初期化
  208. void    init_objects()
  209. {
  210. long    name;
  211. int    ct=0;
  212. OBJ3D    *obj;
  213.     for(;;){
  214.         name = mapdata[ ct++ ];
  215.         if( name==0 ) break;
  216.         obj = make_object( name-1 );
  217.         obj->pos.x = (float)mapdata[ct++]/1000;
  218.         obj->pos.y = (float)mapdata[ct++]/1000;
  219.         obj->pos.z = (float)mapdata[ct++]/1000;
  220.         obj->rudder.x = D3DXToRadian( mapdata[ct++] );
  221.         obj->rudder.y = D3DXToRadian( mapdata[ct++] );
  222.         obj->rudder.z = D3DXToRadian( mapdata[ct++] );
  223.     }
  224. }
  225.  
  226. void    release_objects()
  227. {
  228. OBJ3D    *obj = objtop;
  229. OBJ3D    *nx;
  230.     while( obj !=NULL ){
  231.         nx = obj->next;
  232.         delete_object( obj );
  233.         obj = nx;
  234.     }
  235. }
  236.  
  237. //    プレイヤーステータス初期化
  238. void    init_player()
  239. {
  240.     make_myself();
  241.     D3DXVECTOR3    zero;
  242.     zero.x = zero.y = zero.z = 0;
  243.     myself->objp->pos  = myself->objp->rudder =
  244.     myself->objp->move = myself->objp->rotate = zero;
  245.     myself->objp->rudder.y = D3DXToRadian( 45 );
  246. }
  247. //    プレイヤーによる制御
  248. void    player_drive()
  249. {
  250. WORD    key = GetKeys();
  251.     command_player( myself->objp,( key << 16 )| dpmsg_data_packet );
  252.     send_player_control( myself->dplayID, key );
  253.  
  254.     camera_pos = myself->objp->pos;
  255.     camera_rud = myself->objp->rudder;
  256. }
  257.  
  258.  
  259. //    プレイヤーの挙動
  260. //    複数プレイヤー対応版
  261. void    command_player( OBJ3D *ob,DWORD cmd )
  262. {
  263. WORD    key = (WORD)( cmd>>16 );
  264.  
  265.     if( key & PAD_CMD ){
  266. //    左右に平行移動
  267. //    上下に平行移動
  268.  
  269.     } else {
  270. //    左右に旋回
  271.         if( key & PAD_LEFT ){
  272.             if( ob->rotate.y<0.05f ) ob->rotate.y += 0.002f;
  273.         } else if( key & PAD_RIGHT ){
  274.             if( ob->rotate.y>-0.05f ) ob->rotate.y -= 0.002f;
  275.         } else {
  276.             if( ob->rotate.y>0.002f ) ob->rotate.y *= 0.8f; else ob->rotate.y = 0;
  277.         }
  278. //    上下に旋回(最大上下30度。旋回していないときは、自動的に水平に戻る)
  279.         if( key & PAD_UP ){
  280.             if( ob->rotate.x<0.05f ) ob->rotate.x += 0.002f;
  281.         } else if( key & PAD_DOWN ){
  282.             if( ob->rotate.x>-0.05f ) ob->rotate.x -= 0.002f;
  283.         } else {
  284.             ob->rotate.x = 0;
  285.         }
  286.     }
  287. //    前進
  288.     if( key & PAD_FORWARD ){
  289.         if( ob->move.z<1 ){
  290.             ob->move.z += 0.002f;
  291.         } else {
  292.             ob->move.z = 1;
  293.         }
  294.     } else {
  295.             if( ob->move.z>0.002f ) ob->move.z *= 0.8f; else ob->move.z = 0;
  296.     }
  297. //    ベクトル加算
  298.     ob->rudder.y += ob->rotate.y;
  299.     if( ob->rotate.x!=0 ){
  300.         ob->rudder.x += ob->rotate.x;
  301.         if( ob->rotate.x<0 ){
  302.             if( ob->rudder.x<-0.7f ) ob->rudder.x = -0.7f;
  303.         } else {
  304.             if( ob->rudder.x> 0.7f ) ob->rudder.x = 0.7f;
  305.         }
  306.     } else {
  307.         ob->rudder.x *= 0.8f;
  308.         if( ob->rudder.x<0.01f && ob->rudder.x>-0.01f ){ ob->rudder.x = 0; }
  309.     }
  310. //    移動ベクトル生成
  311.     D3DXMATRIX    mat;
  312.     D3DXMatrixRotationY( &mat,-ob->rudder.y );
  313.     D3DXVECTOR3    mv;
  314.     mv = ob->move;
  315.     D3DXVec3TransformNormal( &mv,&mv,&mat );
  316.     ob->pos += mv;
  317. }
  318.